package com.atguigu.srb.core.service;

import com.atguigu.srb.core.pojo.entity.BorrowInfo;
import com.atguigu.srb.core.pojo.entity.Lend;
import com.atguigu.srb.core.pojo.entity.LendItemReturn;
import com.atguigu.srb.core.pojo.vo.BorrowInfoApprovalVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 标的准备表 服务类
 * </p>
 *
 * @author Bright
 * @since 2022-04-09
 */
public interface LendService extends IService<Lend> {

    /**
     * 创建标的根据前端传来的参数和借款人信息
     *
     * @param borrowInfoApprovalVO 借款操作详情
     * @param borrowInfo           借款详情
     */
    void createLend(BorrowInfoApprovalVO borrowInfoApprovalVO, BorrowInfo borrowInfo);

    /**
     * 得到标的修改参数
     * @return 标的集合
     */
    List<Lend> getList();

    /**
     * 得到标的和借款详情的map集合
     * @param id 标的id
     * @return 标的和借款详情的map集合
     */
    Map<String, Object> getLendDetailById(Long id);

    /**
     * 得到标的以及传入参数
     * @param id  标的id
     * @return 标的
     */
    Lend lendById(Long id);

    /**
     * 得到总利息
     * @param invest 投资金额
     * @param yearRate 年利率
     * @param totalmonth 总月数
     * @param returnMethod 还款方式
     * @return 总利润
     */
    BigDecimal getInterestCount(BigDecimal invest, BigDecimal yearRate, Integer totalmonth, Integer returnMethod);


    /**
     * 满标放款
     * 1.放款接口调用
     * 2.更新标的信息:(放款时间,放款人id,状态,实际收益)
     * 3.给借款人账户放款(扣除相应的手续费)以及生成放款流水
     * 4.投资人账户冻结金额转出及生成转出流水
     * 5.生成借款人还款计划以及借投资人回款计划
     *
     * @param lendId 标的id
     */
    void makeLoan(Long lendId);

    /**
     * 生成回款计划
     * 1.根据期数创建还款计划以及保存
     * 2.获取期数对应的还款计划id
     * 3.调用回款计划方法获取回款计划集合
     * 4.根据回款计集合更新还款计划（本息，本金，利息）
     *
     * @param lend 标的
     */
    void repaymentPlan(Lend lend);

    /**
     * 1.得到标的下的投资项
     * 2.遍历投资项根据期数分别回款计划集合
     * 3.保存回款计划以及返回回款计划集合
     *
     * @param lend         标的
     * @param LendReturnId 还款计划id
     * @return 返回回款计划集合
     */
    List<LendItemReturn> returnInvest(Lend lend, Map<Integer, Long> LendReturnId);

}
